home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 076-100 / disk_096 / animplayer / call_pack.c < prev    next >
C/C++ Source or Header  |  1992-05-06  |  6KB  |  208 lines

  1. /***************************************************************************
  2.  *
  3.  *   NAME 
  4.  *      Call_Pack -- load an ANIM 
  5.  *
  6.  *   SYNOPSIS
  7.  *      patriarch = Call_Pack( animnamestring, bitmap1, bitmap2, 
  8.  *       viewport1, viewport2 );
  9.  *
  10.  *      FrameNode *patriarch;
  11.  *
  12.  *    char *animnamestring;
  13.  *      struct BitMap *bitmap1, *bitmap2;
  14.  *      struct ViewPort *viewport1, *viewport2;
  15.  *
  16.  *   DESCRIPTION
  17.  *      Load an ANIM from disk.  Exit if Read error.  This particular
  18.  *      ANIM packing method has two standard IFF files for the first
  19.  *      two frames, followed by specially packed files.  Even files 
  20.  *    modify only each other, as do odd files.  Files always start
  21.  *      at "1".  Files "1" and "2" are standard IFF.
  22.  *  
  23.  *      copyright (c) 1987 Martin D. Hash
  24.  *
  25.  *   LAST EDITED
  26.  *      Martin Hash            23 Aug 1987
  27.  *
  28.  *   EDIT HISTORY
  29.  *      27 Mar 1987  MH  Created.
  30.  *      20 Apr           Saved palette also.
  31.  *       9 Jun           Faster playback.
  32.  *      16 Aug         ANIM standard.
  33.  *
  34.  **********************************************************************/
  35.  
  36. #include <exec/types.h>
  37. #include <exec/memory.h>
  38. #include <intuition/intuition.h>
  39. #include <libraries/dos.h>
  40. #include <libraries/dosextens.h>
  41. #include "df1:FileCons.h"
  42. #include "df1:ANIMCons.h"
  43.  
  44. /* LOCAL CONSTANTS */
  45.  
  46. #define Abort()        goto Read_Error_Exit
  47.  
  48. /* FUNCTION */
  49.  
  50. FrameNode *Call_Pack( animnamestring, bitmap1, bitmap2, viewport1, viewport2 )
  51.  
  52. char *animnamestring;
  53. struct BitMap *bitmap1, *bitmap2;
  54. struct ViewPort *viewport1, *viewport2;
  55. {
  56.    /* LOCAL VARIABLES */
  57.  
  58.    int frame,
  59.        i,
  60.        count,
  61.        colors;
  62.    char name[STRINGSIZE],
  63.     header[HEADERSIZE],
  64.     frametext[MAXNUMBERTEXT];
  65.    BPTR file;
  66.    ULONG size,
  67.      cmapsize = 0,
  68.      datasize;
  69.    ANHD anhd;
  70.    UWORD *cmap, *cmapptr,
  71.      *data;
  72.    FrameNode *prevframenode = NULL,
  73.          *framenode,
  74.          *patriarch = NULL,
  75.          **uplink;
  76.    ColorReg colorreg;
  77.    
  78.    /* CODE */
  79.  
  80.    colors = COLORS;
  81.  
  82.    uplink = &patriarch;
  83.    for (frame = 1; TRUE; ++frame) {
  84.       stci_d( frametext, frame, sizeof(frametext));
  85.       strcpy( name, animnamestring );
  86.       strcat( name, "/" );
  87.       strcat( name, frametext );
  88.       if ((file = Open( name, MODE_OLDFILE )) == 0)
  89.          return patriarch;
  90.       
  91.       if (frame == 1) {
  92.          if (!ReadPicture( file, bitmap1, viewport1 ))
  93.         Abort();
  94.          if (Read( file, &header, HEADERSIZE*sizeof(char)) == -1)
  95.         Abort();
  96.          if (Read( file, &size, sizeof(ULONG)) == -1)
  97.             Abort();
  98.          if (Read( file, &header, HEADERSIZE*sizeof(char)) == -1)
  99.         Abort();
  100.          if (Read( file, &header, HEADERSIZE*sizeof(char)) == -1)
  101.         Abort();
  102.          if (Read( file, &size, sizeof(ULONG)) == -1)
  103.             Abort();
  104.          if (Read( file, &anhd, sizeof(ANHD)) == -1)
  105.             Abort();
  106.  
  107.          if ((cmap = (UWORD *)AllocMem( colors*sizeof(UWORD),
  108.           MEMF_CHIP )) == NULL)
  109.         Abort();
  110.      cmapptr = (UWORD *)viewport1->ColorMap->ColorTable;
  111.      for (i = 0; i < colors; ++i)
  112.         cmap[i] = cmapptr[i];
  113.      data = NULL;
  114.      datasize = 0;
  115.       }
  116.       else if (frame == 2) {
  117.          if (!ReadPicture( file, bitmap2, viewport2 ))
  118.         Abort();
  119.          if (Read( file, &header, HEADERSIZE*sizeof(char)) == -1)
  120.         Abort();
  121.          if (Read( file, &size, sizeof(ULONG)) == -1)
  122.             Abort();
  123.          if (Read( file, &header, HEADERSIZE*sizeof(char)) == -1)
  124.         Abort();
  125.          if (Read( file, &header, HEADERSIZE*sizeof(char)) == -1)
  126.         Abort();
  127.          if (Read( file, &size, sizeof(ULONG)) == -1)
  128.             Abort();
  129.          if (Read( file, &anhd, sizeof(ANHD)) == -1)
  130.             Abort();
  131.  
  132.          if ((cmap = (UWORD *)AllocMem( colors*sizeof(UWORD),
  133.           MEMF_CHIP )) == NULL)
  134.         Abort();
  135.      cmapptr = (UWORD *)viewport1->ColorMap->ColorTable;
  136.      for (i = 0; i < colors; ++i)
  137.         cmap[i] = cmapptr[i];
  138.      data = NULL;
  139.      datasize = 0;
  140.       }
  141.       else {
  142.          if (Read( file, &header, HEADERSIZE*sizeof(char)) == -1)
  143.             Abort();
  144.          if (Read( file, &size, sizeof(ULONG)) == -1)
  145.             Abort();
  146.          if (Read( file, &header, HEADERSIZE*sizeof(char)) == -1)
  147.             Abort();
  148.          if (Read( file, &header, HEADERSIZE*sizeof(char)) == -1)
  149.             Abort();
  150.          if (Read( file, &cmapsize, sizeof(ULONG)) == -1)
  151.             Abort();
  152.          count = cmapsize/3;
  153.          if ((cmap = (UWORD *)AllocMem( colors*sizeof(UWORD),
  154.           MEMF_CHIP )) == NULL)
  155.         Abort();
  156.      cmapptr = cmap;
  157.      while (count--) {
  158.             if (Read( file, &colorreg, sizeof(ColorReg)) == -1) { 
  159.            FreeMem((UBYTE *)cmap, colors*sizeof(UWORD));
  160.                Abort();
  161.         }
  162.             *cmapptr++ = ((colorreg.red   >>4) <<8) | 
  163.                  ((colorreg.green >>4) <<4) |
  164.                   (colorreg.blue  >>4);
  165.          }
  166.          if (Read( file, header, HEADERSIZE*sizeof(char)) == -1) {
  167.         FreeMem((UBYTE *)cmap, colors*sizeof(UWORD));
  168.             Abort();
  169.      }
  170.          if (Read( file, &datasize, sizeof(ULONG)) == -1) {
  171.         FreeMem((UBYTE *)cmap, colors*sizeof(UWORD));
  172.             Abort();
  173.      }
  174.          if ((data = (UWORD *)AllocMem( datasize, 0 )) == NULL) {
  175.         FreeMem((UBYTE *)cmap, colors*sizeof(UWORD));
  176.         Abort();
  177.          }
  178.          if (Read( file, data, datasize ) == -1) {
  179.             FreeMem((UBYTE *)cmap, colors*sizeof(UWORD));
  180.             Abort();
  181.      }
  182.       }
  183.  
  184.       Close( file );
  185.       if ((framenode = (FrameNode *)AllocMem( sizeof(FrameNode), 0 ))
  186.        == NULL) {
  187.          FreeMem((UBYTE *)cmap, colors*sizeof(UWORD));
  188.          FreeMem((UBYTE *)data, datasize );
  189.          Abort();
  190.       }     
  191.       framenode->prev = prevframenode;
  192.       framenode->next = NULL;
  193.       prevframenode = framenode;
  194.       *uplink = framenode;
  195.       uplink = &framenode->next;
  196.       framenode->cmap = cmap;
  197.       framenode->cmapsize = colors*sizeof(UWORD);
  198.       framenode->data = data;
  199.       framenode->datasize = datasize;
  200.    }
  201.    return patriarch;
  202.  
  203. Read_Error_Exit:
  204.    Close( file );
  205.    return patriarch;  
  206. }
  207.  
  208.